package com.ruoyi.system.untils;

import com.ruoyi.system.domain.BaseFileTable;
import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.util.WebUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public final class FileUtils {
    private FileUtils() {
    }
//@Test
//public void test1(){
//
//
//
//}
    public static void main(String[] args) {

//        String str="解除/终止服务协议\\t协议编号：CTC-CRM-HJTS-2017-001837，CTC-CRM-HJTS-2017-001638，CTC-CRM-HJTS-2017-001639，" +
//                "\\tCTC-CRM-HJTS-2017-001640\\t甲方：中国移动通信集团河北有限公司唐山分公司\\t联系电话：\\t乙方：中国铁塔股份有限公司唐山市分公司" +
//                "\\t联系电话：\\t鉴于，甲方和乙方于2018年1月1日签署了《产品业务确认单》。经甲方和乙方协商一致，\\t双方同意按照本协议约定的条款和条件" +
//                "提前终止协议编号CTC-CRM-HJTS-2017-001837，甲方使用\\t乙方的产品设施位于唐山市遵化市和顺小区（订单映射），经度和纬度分别为117.9" +
//                "50091（订单映\\t射）和40.195435（订单映射），订单号：4217061600399120，站址编码：130281019000000375，" +
//                "\\t站址名称：和顺小区（光分布）；协议编号CTC-CRM-HITS-2017-001638，甲方使用乙方的产品设施" +
//                "\\t位于唐山市古治区古碱路与G205国道交口西1000米处路北（订单映射），经度和纬度分别为" +
//                "\\t118.400014（订单映射）和39.725149（订单映射），订单号：4217041200212593，站址编码：" +
//                "\\t130204019000000146，站址名称：古冶西新楼第一社区（南区）；协议编号\\" +
//                "tCTC-CRM-HITS-2017-001639，甲方使用乙方的产品设施位于唐山市古冶区古碱路与G205国道交口" +
//                "\\t西1000米处路北（订单映射），经度和纬度分别为118.400634（订单映射）和39.727941（订单" +
//                "\\t映射），订单号：4217041200212594，站址编码：130204019000000148，站址名称：古治西新楼第" +
//                "\\t二社区（西区）：协议编号CTC-CRM-HJTS-2017-001640，甲方使用乙方的产品设施位于唐山市古" +
//                "\\t治区古碱路与G205国道交口西1000米处路北（订单映射），经度和纬度分别为118.404008（订单" +
//                "\\t映射）和39.727734（订单映射），订单号：4217041200212595，站址编码：130204019000000147，" +
//                "\\t站址名称：古冶西新楼第三社区（东区）；\\t一、依据甲方向乙_方提出的《终止服务通知单》，并且经乙_方同意，自本协议" +
//                "\\t签署之日起《产品业务确认单》（协议编号：见明细）自动终止。\\t二、自《产品业务确认单》终止之日起【30】日内，甲方应将准载设备从乙方塔枪、机房中拆" +
//                "\\t除并搬离，设备拆除后需经乙方验收通过，乙方应积极配合。\\t三、自《产品业务确认单》终止之日起【30】日内，甲方应按照铁塔公司与【基础电信企业简" +
//                "\\t称】签署的《商务定价协议》及其附件约定的内容补偿乙方的合理经济损失人民币503657.11元。" +
//                "\\t四、双方在拆除、搬离设备过程中，不得对一方及第三方的设备造成损坏损毁，发生损坏的，" +
//                "\\t违约方应赔偿守约方及第三方的修理费用；发生损毁的，按照设备重置价格需要向守约方及第三方" +
//                "\\t支付赔偿金。\\t五、《产品业务确认单》终止之日起【30】日内，甲方应支付未结清产品服务费人民币／元；" +
//                "\\t未结清电费人民币／元。\\t六、本合\\t甲乙双方盖章生效。本合同一式贰份，双方各持壹\\t限公司唐山\\t甲方\\t乙方签约\\t日期\\t日期：\\t网络部";
//        str=str.replace("\\t","");
//        String pStr1="订单号：([\\w]*)";
//        String pStr2="站址编码：([\\w]*)";
//        String pStr3="站址名称：([\\w]*)";
//        Pattern p1 = Pattern.compile(pStr1);
//        Matcher m1 = p1.matcher(str);
//        Pattern p2 = Pattern.compile(pStr2);
//        Matcher m2 = p2.matcher(str);
//        Pattern p3 = Pattern.compile(pStr3);
//        Matcher m3 = p3.matcher(str);
//        m1.find();
//        m2.find();
//        m3.find();
//        System.out.println(m1.groupCount());
//        System.out.println(m2.groupCount());
//        System.out.println(m3.groupCount());
//        int matcher_start1 = 0;
//        while (m1.find(matcher_start1)){
//            System.out.println(m1.group(1));
//            matcher_start1 = m1.end();
//
//        }
//        int matcher_start2 = 0;
//        while (m2.find(matcher_start2)){
//            System.out.println(m2.group(1));
//            matcher_start2 = m2.end();
//
//        }
//        int matcher_start3 = 0;
//        while (m3.find(matcher_start3)){
//            System.out.println(m3.group(1));
//            matcher_start3 = m3.end();
//
//        }
                //String ps=".+/.+会议纪要.+^((?!清单).).*$.+.pdf";
                //String ps=".+会议纪要.+((?!清单).)*$.+.pdf";\&(.+/.+会议纪要.+.pdf)
                String ps=".+/.+会议纪要.*清单.+.pdf";
        String xx="/home/hebei/302050200000039289482照片/XXX解除终会议纪要清单协议XXX.pdf";
        Pattern p = Pattern.compile(ps);
        Matcher m = p.matcher(xx);
        System.out.println(m.matches());
        //System.out.println(m.group(1));

//        String pa=".+/拉远情况说明.jpg";
//        //String pa2=".+/(\\d+)\\-?照片/.+jpg";
//        String xx="/home/hebei/hebei-service/decompressP1000000156/rru机房被拉远机房ID/rru机房被拉远机房ID/001302050200000039289482照片/拉远情况说明.jpg";
//        String xx2="/home/hebei/hebei-service/decompressP1000000156/rru机房被拉远机房ID/rru机房被拉远机房ID/001302050200000039289482照片/全景图片.jpg";
//        Pattern p = Pattern.compile(pa);
//        //Pattern p2 = Pattern.compile(pa2);
//        Matcher m = p.matcher(xx);
//        System.out.println(m.matches());
        //Matcher m2 = p2.matcher(xx2);
        //System.out.println(m.group(1));
       // System.out.println(m2.group(1));
//        String xxdd="CTC-HJHD-2021-000533中国铁塔股份有限公司XXX项目合同.doc";
//        String xxddPP="([\\w|\\-]*).+";
//        Pattern p = Pattern.compile(xxddPP);
//        Matcher m = p.matcher(xxdd);
//        System.out.println(m.matches());
//        System.out.println(m.group(1));



//        String str = "……^1dsf  の  adS   DFASFSADF阿德斯防守对方asdfsadf37《？：？@%#￥%#￥%@#$%#@$%^><?1234";
//        String regEx="([a-zA-Z0-9])";
//        Pattern   p   =   Pattern.compile(regEx);
//        Matcher   m   =   p.matcher(str);
//        StringBuffer sb = new StringBuffer();
//        while(m.find()){
//            //sb.append(m.group());
//            System.out.println(m.group(1));
//
//        }
        //System.out.println(m.group(1));

    }



    /**
     * 上传至minio服务器
     *
     * @param minioClient
     * @param multipartFile
     * @return
     */
    public static BaseFileTable uploadFileToMinio(MinioClient minioClient, MultipartFile multipartFile, String filePreName) {
        log.info("================开始上传 {} 文件至minio", multipartFile.getOriginalFilename());
        String minioId = null;
        try {
            String bucket = FileUtils.getSuffix(multipartFile.getOriginalFilename());
            minioId = UUID.randomUUID().toString().trim().replaceAll("-", "");
            String fileName=ObjectUtils.isEmpty(filePreName) ? minioId : filePreName + "/" + minioId;
            MinioUtil.upload(minioClient, bucket, multipartFile.getInputStream(), fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (!ObjectUtils.isEmpty(minioId)) {
            //将文件保存到服务器指定位置
            BaseFileTable fileInfoEntity = new BaseFileTable();
            fileInfoEntity.setFileName(multipartFile.getOriginalFilename());
            fileInfoEntity.setFileType(multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1));
            //fileInfoEntity.setFileSize(new BigDecimal(multipartFile.getSize()).divide(new BigDecimal(1024l)).doubleValue());
            //fileInfoEntity.setFileSize(multipartFile.getSize());
            //fileInfoEntity.setc(System.currentTimeMillis());
            fileInfoEntity.setMinioId(minioId);
            return fileInfoEntity;
        } else {
            return null;
        }

    }

    public static InputStream downloadFromMinio(MinioClient minioClient, String minioId, String bucket) {
        return MinioUtil.download(minioClient, bucket, minioId);
    }
    public static void writeFile(InputStream is,String fileName) throws IOException{
        BufferedInputStream in=null;
        BufferedOutputStream out=null;
        in=new BufferedInputStream(is);
        out=new BufferedOutputStream(new FileOutputStream(fileName));
        int len=-1;
        byte[] b=new byte[1024];
        while((len=in.read(b))!=-1){
            out.write(b,0,len);
        }
        in.close();
        out.close();
    }

    /**
     * 上传到本地目录
     *
     * @param multipartFile
     * @param path
     * @return
     */
    public static BaseFileTable uploadFile(MultipartFile multipartFile, String path) {
        //获取文件在服务器的储存位置
        File filePath = new File(path);
        System.out.println("文件的保存路径：" + path);
        if (!filePath.exists() && !filePath.isDirectory()) {
            System.out.println("目录不存在，创建目录:" + filePath);
            filePath.mkdirs();
        }

        //获取原始文件名称(包含格式)
        String originalFileName = multipartFile.getOriginalFilename();
        System.out.println("原始文件名称：" + originalFileName);

        //获取文件类型，以最后一个`.`为标识
        String type = FileUtils.getSuffix(originalFileName);
        System.out.println("文件类型：" + type);
        //获取文件名称（不包含格式）
        String name = originalFileName.substring(0, originalFileName.lastIndexOf("."));

        //设置文件新名称: 当前时间+文件名称（不包含格式）
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String date = sdf.format(d);
        String fileName = name + "-" + date + "." + type;
        System.out.println("新文件名称：" + fileName);

        //在指定路径下创建一个文件
        File targetFile = new File(path, fileName);
        Map<String, Object> map = new HashMap<>();
        map.put("fileName", fileName);
        
        map.put("path", path);
        //将文件保存到服务器指定位置
        BaseFileTable fileInfoEntity = new BaseFileTable();
        //fileInfoEntity.setFilePath(path);
        fileInfoEntity.setFileName(fileName);
        //fileInfoEntity.setDataTime(System.currentTimeMillis());
        try {
            multipartFile.transferTo(targetFile);
            System.out.println("上传成功");
            //将文件在服务器的存储路径返回
            return fileInfoEntity;
        } catch (IOException e) {
            System.out.println("上传失败");
            e.printStackTrace();
            return null;
        }

    }

    public static Iterator<MultipartFile> getFiles(HttpServletRequest request) {
        MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        Iterator<MultipartFile> iterator = fileMap.values().iterator();
        return iterator;
    }

    public static void download(String filename, HttpServletResponse res) throws IOException {
        // 发送给客户端的数据
        OutputStream outputStream = res.getOutputStream();
        byte[] buff = new byte[1024];
        BufferedInputStream bis = null;
        // 读取filename
        bis = new BufferedInputStream(new FileInputStream(new File(filename)));
        int i = bis.read(buff);
        while (i != -1) {
            outputStream.write(buff, 0, buff.length);
            outputStream.flush();
            i = bis.read(buff);
        }
    }

    public static String getSuffix(String fileName) {
        if (fileName.indexOf('.') == -1) {
            return MinioUtil.OTHER_BUCKET;
        }
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }
}
